#include <Arduino.h>
// #include <WiFi.h>
// #include <esp32ModbusTCP.h>

// // ====================== 平台配置 ======================
// const char *platformServer = "iot.modbus.cn"; // 平台服务器地址
// const uint16_t platformPort = 50001;          // 平台端口
// const char *deviceSN = "wi2fRGV";             // 平台创建设备后获取的SN

// // ====================== WiFi配置 ======================
// const char *ssid = "15367660966";
// const char *password = "15367660";
#include <WiFi.h>
#include <PubSubClient.h>

// Modbus 物联网平台参数（需替换为实际值）
const char *ssid = "Sensen";                        // WiFi 名称
const char *password = "15367660";                  // WiFi 密码
const char *mqtt_server = "iot.modbus.cn";          // MQTT服务器地址
const int mqtt_port = 1883;                         // MQTT服务器端口号
const char *mqtt_clientID = "wi2fRGV";              // MQTT客户端ID; 4QR8TZ9ThuL4G替换成自己的设备号SN
const char *mqtt_user = "15367660966";              // MQTT用户名;替换成自己Modbus云平台账户名
const char *mqtt_password = "15367660";             // MQTT密码;替换成自己Modbus云平台密码
const char *mqtt_pub_topic = "/dev/coo/wi2fRGV";    // MQTT发布主题; 4QR8TZ9ThuL4G替换成自己的设备号SN
const char *mqtt_sub_topic = "/server/coo/wi2fRGV"; // MQTT订阅主题; 4QR8TZ9ThuL4G替换成自己的设备号SN

WiFiClient espClient;           // WiFi客户端对象
PubSubClient client(espClient); // MQTT客户端对象

// 连接WiFi的函数
void setup_wifi()
{
  delay(10);
  Serial.println();
  Serial.print("连接到 ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi已连接");
  Serial.println("IP地址: ");
  Serial.println(WiFi.localIP());
}

// 发布消息的函数
void publish_message()
{
  float humidity = 8.8;    // 读取湿度
  float temperature = 9.9; // 读取温度

  char msg[200];
  // 转义双引号、花括号等特殊字符
  snprintf(msg, sizeof(msg), "[ { \"sensor_device_id\":1, \"port_id\":1, \"sdata\":%.1f }, { \"sensor_device_id\":1, \"port_id\":1, \"sdata\":%.1f } ]", humidity, temperature);
  if (client.publish(mqtt_pub_topic, msg))
  {
    Serial.println(msg);
  }
}

// MQTT消息回调函数
void callback(char *topic, byte *payload, unsigned int length)
{
  Serial.print("接收到消息 [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++)
  {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

// 重新连接MQTT服务器的函数
void reconnect()
{
  while (!client.connected())
  {
    Serial.print("尝试连接MQTT服务器...");
    if (client.connect(mqtt_clientID, mqtt_user, mqtt_password))
    {
      Serial.println("已连接");
      client.subscribe(mqtt_sub_topic);
    }
    else
    {
      Serial.print("失败，rc=");
      Serial.print(client.state());
      Serial.println(" 5秒后再次尝试");
      delay(5000);
    }
  }
}

// 设置串口，WiFi，MQTT服务器和端口，回调函数
void setup()
{
  Serial.begin(115200);                     // 设置串口波特率为115200
  setup_wifi();                             // 设置WiFi
  client.setServer(mqtt_server, mqtt_port); // 设置MQTT服务器和端口
  client.setCallback(callback);             // 设置MQTT回调函数
}

void loop()
{
  if (!client.connected())
  {              // 如果未连接到MQTT服务器
    reconnect(); // 重新连接
  }
  client.loop(); // 执行MQTT客户端循环

  publish_message(); // 发布消息

  delay(10000); // 延迟10秒后，再次发布
}